package com.yyfax.pay.order.model.vo;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Ordering;
import com.yyfax.pay.common.enums.OrderStateEnum;
import com.yyfax.pay.order.model.po.PayoutOrderLogPO;
import com.yyfax.pay.order.model.po.PayoutOrderPO;

/**
 * 代付订单快照信息
 * 
 * @author buyi
 * @date 2017-04-16 11:42:11
 * @since v1.0.0
 */
public class PayoutOrderVO {
	private PayoutOrderPO payoutOrderPO;

	private List<PayoutOrderLogPO> orderLogPOs;

	public PayoutOrderPO getPayoutOrderPO() {
		return payoutOrderPO;
	}

	public void setPayoutOrderPO(PayoutOrderPO payoutOrderPO) {
		this.payoutOrderPO = payoutOrderPO;
	}

	public List<PayoutOrderLogPO> getOrderLogPOs() {
		return orderLogPOs;
	}

	public void setOrderLogPOs(List<PayoutOrderLogPO> orderLogPOs) {
		// 默认排序
		Collections.sort(orderLogPOs, new Comparator<PayoutOrderLogPO>() {
			// 排序规则，先按照step从大到小，再按照resultcode从小到大
			public int compare(PayoutOrderLogPO object1, PayoutOrderLogPO object2) {
				return ComparisonChain.start().compare(object1.getStep(), object2.getStep(), Ordering.natural().reverse())
						.compare(object1.getResultCode(), object2.getResultCode()).result();
			}
		});

		this.orderLogPOs = orderLogPOs;
	}

	/**
	 * 判断代付订单是否已经出结果<br>
	 * 如果订单状态是不是初始化状态，就表示已经出结果
	 * 
	 * @author buyi
	 * @date 2018-05-11 16:10:14
	 * @since v2.1.5
	 * @return true-表示订单已经出结果，false-表示订单未出结果
	 */
	public boolean isResult() {
		// 代付业务场景，订单状态只有初始化、成功，失败、处理中、超时

		if (StringUtils.isBlank(getState())) {
			// 订单状态为空，有可能是旧版本的存量数据导致的，返回未出结果，外部调用，需要自己再做处理
			return false;
		}

		// 新版本，字段state存在值，按照新的业务逻辑判断订单结果
		if (OrderStateEnum.INI.isValue(payoutOrderPO.getState())) {
			return false;
		}
		return true;

		// // 如果订单状态state是空值，则走旧业务流程，根据流水记录查询订单结果
		// // payout_order新增字段state,rspCode,rspMsg不在从流水日志判断订单结果，兼容旧版本，没有state的场景
		// PayoutOrderLogPO log = getOrderLastResultStep();
		// // if (log != null && !PayRspCodeEnum.PAY_CODE_REQ_TIME_OUT.isValue(log.getResultCode())) {
		// if (log != null) {
		// // 如果存在存在最后一步订单流水，则说明代付已经出结果，代付的接口都是同步的，有业务就有结果
		// return true;
		// }
		//
		// return false;
	}

	/**
	 * 获取状态位
	 * 
	 * @author buyi
	 * @date 2018-05-11 16:32:59
	 * @since v2.1.5
	 * @return
	 */
	public String getState() {
		return payoutOrderPO.getState();
	}

	/**
	 * 获取响应码
	 * 
	 * @author buyi
	 * @date 2018-05-11 16:26:21
	 * @since v2.1.5
	 * @return
	 */
	public Integer getRspCode() {
		return payoutOrderPO.getRspCode();
	}

	/**
	 * 获取响应描述
	 * 
	 * @author buyi
	 * @date 2018-05-11 16:27:20
	 * @since v2.1.5
	 * @return
	 */
	public String getRspMsg() {
		return payoutOrderPO.getRspMsg();
	}

	/**
	 * 获取最后一步日志（排除掉回复商户的日志）
	 * 
	 * @return
	 * @deprecated 作废，不在使用流水作为判断订单结果 edit by buyi since 2.1.4
	 */
	public PayoutOrderLogPO getOrderLastResultStep() {
		if (null == orderLogPOs) {
			return null;
		}

		// orderLogPOs在set的时候，已经按照step从到小排序，所以在非空的场景，直接取第一条流水，就代表结果流水,edit by buyi since 2.1.4
		// PayoutOrderLogPO lastResultPO = null;
		// Collections.sort(orderLogPOs, new Comparator<PayoutOrderLogPO>() {
		// // 排序规则，先按照step从大到小，再按照resultcode从小到大
		// public int compare(PayoutOrderLogPO object1, PayoutOrderLogPO object2) {
		// return ComparisonChain.start().compare(object1.getStep(), object2.getStep(), Ordering.natural().reverse())
		// .compare(object1.getResultCode(), object2.getResultCode()).result();
		// }
		// });
		//
		// for (PayoutOrderLogPO po : orderLogPOs) {
		// lastResultPO = po;
		// break;
		// }
		//
		// return lastResultPO;
		return orderLogPOs.get(0);
	}

}
